package cn.com.dycc.util;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.com.dycc.common.attach.entity.Attach;
import cn.com.dycc.common.entity.ImportEntity;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;


/**
 * 字符串处理类
 * @author gaofan
 *
 */
public class StringUtil {
	
	/**
	 * 获取时间范围内的年月信息
	 * @param year 起始年
	 * @param span 跨度
	 * @param months 1-12月显示格式
	 * @return
	 */
	public static String[] getYearSpanMonth(int year,int span,String[]months){
		int a=Math.abs(span);
		int b=year;
		String [] year_months=new String[12*a];
		int j=0;
		if(span>=0){
			for(int i=1;i<=a;i++){
				year=b+span-i;
				for(String month:months){
					year_months[j]=year+month;
					j++;
				}
				
			}
		}else{
			for(int k=0;span++<0;k++){
				year=b-k;
				for(String month:months){
					year_months[j]=year+month;
					j++;
				}
				
			}
		}
		
		
		return year_months;
	}
	
	/**
	 * 将json字符串数组转换成对应Class 对象的集合
	 * @param jsonStr json字符串数组
	 * @param class1 转换对象Class
	 * @param save_attributes 保存属性
	 * @return
	 */
	public static List<Object> getObjectByJson(String jsonStr, Class class1, String[] save_attributes)
	  {
	    List list = new ArrayList();
	    if ((jsonStr == null) || (jsonStr.trim().isEmpty()))
	      return list;
	    try
	    {
	      JSONArray json = JSONArray.fromObject(jsonStr);
	      for (int i = 0; i < json.size(); i++) {
	        Object check = json.get(i);
	        if (!"null".equals(check.toString()))
	        {
	          Object entity = class1.newInstance();
	          Field[] fields = entity.getClass().getDeclaredFields();
	          JSONObject job = json.getJSONObject(i);
	          for (String attribute : save_attributes) {
	            Object value = job.get(attribute);
	            for (Field field : fields) {
	              if (attribute.equals(field.getName())) {
	                field.setAccessible(true);
	                field.set(entity, value);
	                break;
	              }
	            }
	          }

	          list.add(entity);
	        }
	      }
	    }
	    catch (InstantiationException e) {
	      e.printStackTrace();
	    } catch (IllegalAccessException e) {
	      e.printStackTrace();
	    }

	    return list;
	  }
	
	/**
	 * 
	 * @param jsonStr
	 * @return
	 */
	public static List<ImportEntity> getImportEntity(String jsonStr){
		if(jsonStr==null||jsonStr.trim().isEmpty()){
			return null;
		}
		List<ImportEntity> list=new ArrayList<ImportEntity>();
		JSONArray json=JSONArray.fromObject(jsonStr);
		
		for(int i=0;i<json.size();i++){
			
			Object check=json.get(i);			
			if("null".equals(check.toString())){
				continue;
			}
			JSONObject job = json.getJSONObject(i); // 遍历 jsonarray 数组，把每一个对象转成 json 对象			
			String name=(String)job.get("name");
			String value=(String)job.get("value");
			ImportEntity entity=new ImportEntity(name, value);			
			list.add(entity);
									
		}
		return list;
		
	}
	
	/**
	 * 将字符串首字母大写
	 * @param s
	 * @return
	 */
	public static String toUpperCaseFirstOne(String str){
		if(str==null||str.trim().isEmpty()){
			return null;
		}
		if(Character.isUpperCase(str.charAt(0))){
			return str;
		}else{
			return new StringBuilder().append(str.charAt(0)).toString().toUpperCase()+str.substring(1);
		}
	}
	
	/**
	 * 判断字符串中是否包含中文
	 * @param str
	 * 待校验字符串
	 * @return 是否包含中文
	 * @warn 不能校验是否为中文标点符号 
	 */
	public static boolean isContainChinese(String str) {
				
		Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
		Matcher m = p.matcher(str);
		if (m.find()) {
		 return true;
		}
		return false;
	}
	
	/**
	 * 将jsonStr数组字符串转换为数组
	 * @param jsonStr
	 * @return
	 */
	public static String[] getArray(String jsonStr){
		
		if(jsonStr!=null&&!jsonStr.trim().isEmpty()){			
			String str=jsonStr.trim();
			JSONArray json=JSONArray.fromObject(str);
			StringBuilder str_array=new StringBuilder();
			
			for(int i=0;i<json.size();i++){
				
				Object check=json.get(i);
				if("null".equals(check.toString())){
					continue;
				}
				if("".equals(str_array.toString())){
					str_array.append(json.getString(i));
					System.out.println("");
				}else{
					str_array.append(","+json.getString(i));
				}
							
			}
			
			return str_array.toString().split(",");
			
			
		}else {
			return null;
		}
	}
	
	/**
	 * 将内容中的html标签删除
	 * @return
	 */
	public static String deleteLable(String content){
		if(content==null){
			return "";
		}
		int i=content.indexOf("<");
		boolean flag=true;
		while (flag) {
			if(i!=-1){
				int j=content.indexOf(">", i);
				if(j!=-1){
					if(i!=0){
						String content2=content.substring(0, i);
						content=content2+content.substring(j+1);
					}else {
						content=content.substring(j+1);
					}
					
					i=content.indexOf("<");
				}else {
					flag=false;
				}
			}else {
				flag=false;
			}
			
		}
		
		content=content.replaceAll("&nbsp;", "");
		
		return content;
	}
	
	/**
	 * 将ASCii码解码
	 * @param str
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static String decode(String str) throws UnsupportedEncodingException{
		if(str==null||str.trim().isEmpty()){
			return "";
		}
		return URLDecoder.decode(str,"UTF-8");
	}
	
	/**
	 * 检测字符串是否是双精度字符串
	 * @param 被检测的字符串
	 * @return 
	 */
	public static boolean checkDouble(String str){
		str=format_NullToString(str);
		return str.matches(ConfigRegex.doubleRegex)?true:false;
	}
	
	/**
	 * 根据数组jsonStr字符串获得附件对象集合
	 * @param jsonStr 数组json字符串
	 * @param message_no 对应消息/文档ID//业务ID等
	 * @param attach_type 文档类型
	 * @param org_id 组织id
	 * @param opt_user_id 创建人id
	 * @return
	 */
	public static List<Attach> getListAttach(String jsonStr,String message_no,String attach_type,String org_id,String opt_user_id){
		List<Attach> listAttach=new ArrayList<Attach>();
		String str=jsonStr.trim();	
		JSONArray json=JSONArray.fromObject(str);
		for(int i=0;i<json.size();i++){
			Object check=json.get(i);		
			if("null".equals(check.toString())){
				continue;
			}
			JSONObject job = json.getJSONObject(i); // 遍历 jsonarray 数组，把每一个对象转成 json 对象		
			String attach_ext=(String)job.get("attach_ext");
			String attach_path=(String)job.get("attach_path");
			String attach_size=(String)job.get("attach_size");
			String title=(String)job.get("title");
			Attach attach=new Attach();
			attach.setMessage_no(message_no);
			attach.setAttach_type(StringUtil.format_StringToInteger(attach_type));
			attach.setTitle(title);
			attach.setAttach_ext(attach_ext);
			attach.setAttach_path(attach_path);
			attach.setAttach_size(attach_size);				
			attach.setOrg_id(org_id);
			attach.setOpt_user_id(opt_user_id);
			attach.setCreate_date(DateUtil.getNowTimestamp());
			listAttach.add(attach);		
		}
		return listAttach;
		
	}
	
	/**
	 * 处理PC端与手机端返回附件路径的不同
	 * @param path
	 * @return
	 */
	public static String attachPath(String path){
		String regx="/../../../";
		if(path.indexOf(regx)!=-1){
			path=path.replaceFirst(regx, "../../");		
		}
		return path;
	}
	/**
	 * 两个Double数相除，
	 * @param num1 除数
	 * @param num2 被除数
	 * @param scale 保留scale位小数
	 * @return
	 */
	public static String divDouble(double num1,double num2,int scale){
		BigDecimal data1=new BigDecimal(num1);
		BigDecimal data2=new BigDecimal(num2);
		return format_DoubleToString( data1.divide(data2,scale,BigDecimal.ROUND_HALF_UP).doubleValue());
	}
	/**
	 * double相乘
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String mulDouble(double num1,double num2){
		BigDecimal data1=new BigDecimal(num1);
		BigDecimal data2=new BigDecimal(num2);
		return format_DoubleToString(data1.multiply(data2).doubleValue());
	}
	/**
	 * double相减
	 * @param num1 减数
	 * @param num2 被减数
	 * @return
	 */
	public static String subDouble(double num1,double num2){
		BigDecimal data1=new BigDecimal(num1);
		BigDecimal data2=new BigDecimal(num2);
		return format_DoubleToString(data1.subtract(data2).doubleValue());
	}
	
	
	/**
	 * double相加
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String addDouble(double num1,double num2){
		BigDecimal data1=new BigDecimal(num1);
		BigDecimal data2=new BigDecimal(num2);
		return format_DoubleToString(data1.add(data2).doubleValue());
	}
	/**
	 * 返回百分比(%)
	 * @param num1 除数
	 * @param num2 被除数
	 * @return
	 */
	public static String PercentDone(String num1,String num2){
		if(num1==null||num1.trim().isEmpty()){
			return "";
		}
		if(num2==null||num2.trim().isEmpty()){
			return "";
		}
		double a=format_StringToDouble(num1);
		double b=format_StringToDouble(num2);
		double percent=Double.valueOf(mulDouble(format_StringToDouble(divDouble(a,b,2)), 100));
		int ipercent=(int)percent;
		return Integer.valueOf(ipercent).toString();
	}
	
	/**
	 * 比较数字num1是否比num2大
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static boolean compareNumber(String num1,String num2){
		if("".equals(num1)){
			num1="0";
		}
		if("".equals(num2)){
			num2="0";
		}
		double a=format_StringToDouble(num1);
		double b=format_StringToDouble(num2);
		BigDecimal data1=new BigDecimal(a);
		BigDecimal data2=new BigDecimal(b);
		return data1.compareTo(data2)>0?true:false;
	}
	
	/**
	 * double类型比较大小 -- 返回最大的
	 * @param num1  
	 * @param num2 
	 * @return
	 */
	public static String getMaxNumber(String num1,String num2){
		if("".equals(num1)){
			num1="0";
		}
		if("".equals(num2)){
			num2="0";
		}
		double a=format_StringToDouble(num1);
		double b=format_StringToDouble(num2);
		BigDecimal data1=new BigDecimal(a);
		BigDecimal data2=new BigDecimal(b);
		if(data1.compareTo(data2)>0){
			return num1;
		}
		return num2;
	}
	/**
	 * double类型比较大小 -- 返回最小的
	 * @param num1
	 * @param num2
	 * @return
	 */
	public static String getMinNumber(String num1,String num2){
		if("".equals(num1)){
			num1="0";
		}
		if("".equals(num2)){
			num2="0";
		}
		double a=format_StringToDouble(num1);
		double b=format_StringToDouble(num2);
		BigDecimal data1=new BigDecimal(a);
		BigDecimal data2=new BigDecimal(b);
		if(data1.compareTo(data2)>0){
			return num2;
		}
		return num1;
	}
	
	
	/**
	 * 获得模糊字符串
	 * @param str 要转换的str
	 * @return 模糊字符串
	 */
	public static String format_mh_str(String str){
		if(str==null||str.trim().isEmpty()){
			return str;
		}
		return "%"+str.trim()+"%";
	}
	/**
	 * 将null转换为空字符串
	 * @param str
	 * @return
	 */
	public static String format_NullToString(String str){
		if(str==null||str.trim().isEmpty()){
			str="";
		}
		return str;
	}
	/**
	 * 将double类型转换成字符串
	 * @param d
	 * @return
	 */
	public static String format_DoubleToString(double d){
		return Double.toString(d);
	}
	
	/**
	 * 将字符串转换成数字
	 * @param str
	 * @return
	 */
	public static int format_StringToInt(String str){
		if(str==null||str.trim().isEmpty()){
			return 0;
		}
		return Integer.parseInt(str.trim());
	}
	
	/**
	 * 将数字转换为字符串
	 * @param d
	 * @return
	 */
	public static String format_IntToString(int d){
		return String.valueOf(d);
	}
	/**
	 * 将字符串转换为Integer类型
	 * @param str
	 * @return
	 */
	public static Integer format_StringToInteger(String str){
		if(str==null||str.trim().isEmpty()){
			str="0";
		}
		return Integer.valueOf(str);
	}
	
	/**
	 * 将字符串转换为Double类型
	 * @param str
	 * @return
	 */
	public static Double format_StringToDouble(String str){
		if(str==null||str.trim().isEmpty()){
			str="0";
		}
		return Double.valueOf(str);
	}
	
	public static String filterContent(String contentValue){
		
		String filePath=StringUtil.class.getClassLoader().getResource("db/filterRule.txt").getPath();
		String[] filters=FileUtil.readTxt(filePath);
		
		for(String regex:filters){
			String[] regexs=regex.split("=");
			Pattern pattern = Pattern.compile(regexs[0],Pattern.CASE_INSENSITIVE);
	        Matcher matcher = pattern.matcher(contentValue);
			contentValue=matcher.replaceAll(regexs[1]);
			
		}
		return contentValue;
		/*String flt ="'#drop#and#exec#insert#select#delete#count#chr#mid#master#onmouseover#dprompt#truncate#script#iframe#char#declare#<#>"; 
		String filter[] = flt.split("#");
		//content = content.toLowerCase();
		if(!(content==null))
		{
			for(int i=0; i<filter.length; i++) {
				content = content.replace(filter[i], "");
				String wordReg = "(?i)"+filter[i];//用(?i)来忽略大小写
				StringBuffer sb = new StringBuffer();
				Matcher matcher = Pattern.compile(wordReg).matcher(content);
				while(matcher.find())
				{
			  	matcher.appendReplacement(sb, "");  //将匹配的字符串直接删除
				}
				matcher.appendTail(sb);
				content = sb.toString();
			}
		}
		return content;*/
	}

	

}
